package com.kaigejava.juc.queue.api;

import org.junit.Test;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author kaigejava
 * 第四组API:
 * 阻塞，等待，当到阻塞时间仍未操作成功，退出
 * 添加元素：offer(e,time,unit):
 *  参数说明：
 *      e：需要添加到队列中的元素
 *      time:long类型的。预设定的等待超时时间
 *      unit:TimeUnit对象
 *  当队列未满的时候，返回true;
 *  当队列满的时候，进入阻塞等待状态，当等待时间到了预定的超时时间的时候，如果还没有添加到队列中的时候，会返回false.
 *  注意：进入阻塞等待状态的时候，有可能会被中断的。故调用此方法会抛出中断异常：InterruptedException
 * 移除元素：poll(time,unit)：
 *  当队列不为空的时候，返回的是别移除的元素；
 *  当队列为空的时候，进入到阻塞等待状态，当等待时间到了预设定的时间的时候，如果队列依然没有任何原始的时候，返回努力了.
 *  注意：进入阻塞等待状态的时候，有可能会被中断的。故调用此方法会抛出中断异常：InterruptedException
 */
public class BlockingTimeApi {

    @Test
    public void blockingTimeTest() throws InterruptedException {
        ArrayBlockingQueue<String> abQueue = new ArrayBlockingQueue<>(3);
        System.out.println(abQueue.offer("凯哥",1, TimeUnit.MINUTES));
        System.out.println(abQueue.offer("凯哥java",1, TimeUnit.MINUTES));
        System.out.println(abQueue.offer("kaigejjava",1, TimeUnit.MINUTES));
        System.out.println("==队列已经满了，接着像队列中添加元素=="+System.currentTimeMillis());
        System.out.println(abQueue.offer("凯哥Java(kaigejava)",2, TimeUnit.SECONDS));
        System.out.println("====到了预定的超时时间，退出等待===="+System.currentTimeMillis());
        for (int i = 0; i <4 ; i++) {
            if(i==2){
                System.out.println("==队列已经空了=="+System.currentTimeMillis());
            }
            System.out.println("poll:"+abQueue.poll(1,TimeUnit.SECONDS));
            if(i== 3){
                System.out.println("==队列已经空了,也到了超时时间，退出等待=="+System.currentTimeMillis());
            }
        }

    }
}
